package io.easyspring.invitation.core.support;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Future;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;

/**
 * 邀请信息主体
 *
 * @author summer
 * @version 2.0.0-RELEASE
 * DateTime 2019-06-22 12:35
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
public class EasyInvitation implements Serializable {

    private static final long serialVersionUID = -4384251409305246858L;

    /**
     * 邀请者外键
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @NotNull(message = "邀请者外键不能为空")
    @Min(value = 0, message = "邀请者外键 不合法")
    private Long inviterId;
    /**
     * 邀请者名称
     */
    @NotNull(message = "邀请者名称不能为空")
    private String inviterName;

    /**
     * 被邀请外键
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @NotNull(message = "被邀请外键不能为空")
    @Min(value = 0, message = "被邀请外键 不合法")
    private Long inviteeId;
    /**
     * 被邀请者名称
     */
    @NotNull(message = "被邀请者名称不能为空")
    private String inviteeName;

    /**
     * 分享的主体外键
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @NotNull(message = "分享的主体外键不能为空")
    @Min(value = 0, message = "分享的主体外键 不合法")
    private Long shareHostId;
    /**
     * 分享的主体名称
     */
    @NotNull(message = "分享的主体名称不能为空")
    private String shareHostName;

    /**
     * 分享的主体类别
     */
    @NotBlank(message = "分享的主体类别不能为空")
    private String shareHostType;
    /**
     * 扩展信息(分享的主体的更详细的信息)
     */
    private Map<String, Object> extend;
    /**
     * 验证码
     */
    @NotBlank(message = "验证码不能为空")
    private String verificationCode;
    /**
     * 赴约地址
     */
    @NotBlank(message = "赴约地址不能为空")
    private String appointmentUrl;
    /**
     * 过期时间
     */
    @NotNull(message = "过期时间不能为空")
    @Future(message = "到期时间必须是未来的时间")
    private Date expireTime;
}
